package com.javatip.common.utils;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class ImageResizer {

    /**
     * 遍历给定目录及其子目录，调整所有图片文件的大小。
     *
     * @param directoryPath 目录路径
     * @param targetWidth   目标宽度
     * @param targetHeight  目标高度
     */
    public static void resizeAndConvertImages(String directoryPath, int targetWidth, int targetHeight) {
        File directory = new File(directoryPath);
        System.out.println("directoryPath:"+directoryPath);

        // 检查是否为目录
        if (!directory.isDirectory()) {
            System.out.println("指定的路径不是一个目录");
            return;
        }

        // 处理图像
        File[] files = directory.listFiles();

        if (files == null || files.length == 0) {
            System.out.println("目录中没有文件");
            return;
        }

        for (File file : files) {
            if (file.isFile() && isImageFile(file)) {
                // 处理 image 文件夹中的文件
                if (directoryPath.toLowerCase().contains("image")) {
                    resizeImage(file, targetWidth, targetHeight, "jpg");
                }
                //
                else if (directoryPath.toLowerCase().contains("label1")) {

                    resizeImage(file, targetWidth, targetHeight, "png");
                    // 对标签图像进行像素值调整
                    adjustLabelPixels(new File(file.getParent(), getFileNameWithoutExtension(file) + ".png"),1);
                }
                // 处理 label 文件夹中的文件
                else if (directoryPath.toLowerCase().contains("label")) {
                    resizeImage(file, targetWidth, targetHeight, "png");
                    // 对标签图像进行像素值调整
                    adjustLabelPixels(new File(file.getParent(), getFileNameWithoutExtension(file) + ".png"),255);
                }
            } else if (file.isDirectory()) {
                // 递归处理子目录
                resizeAndConvertImages(file.getAbsolutePath(), targetWidth, targetHeight);
            }
        }



//        for (File file : files) {
//            if (file.isFile() && isImageFile(file)) {
//                // 获取文件的扩展名（小写）
//                String extension = getFileExtension(file).toLowerCase();
//
//                // 处理 image 文件夹中的文件
//                if (directoryPath.toLowerCase().contains("image")) {
//                    resizeImage(file, targetWidth, targetHeight, extension); // 保留原格式
//                }
//                // 处理 label 文件夹中的文件
//                else if (directoryPath.toLowerCase().contains("label")) {
//                    resizeImage(file, targetWidth, targetHeight, extension); // 保留原格式
//                }
//            } else if (file.isDirectory()) {
//                // 递归处理子目录
//                resizeAndConvertImages(file.getAbsolutePath(), targetWidth, targetHeight);
//            }
//        }

    }


    // 获取文件扩展名的方法
    private static String getFileExtension(File file) {
        String name = file.getName();
        int lastDotIndex = name.lastIndexOf('.');
        if (lastDotIndex > 0 && lastDotIndex < name.length() - 1) {
            return name.substring(lastDotIndex + 1);
        }
        return "";  // 如果没有扩展名，返回空字符串
    }

    /**
     * 判断文件是否为图片类型。
     *
     * @param file 文件
     * @return 如果文件是图片类型，则返回 true；否则返回 false
     */
    private static boolean isImageFile(File file) {
        String[] imageExtensions = {"jpg", "jpeg", "png", "bmp", "gif", "tiff","tif"};
        String fileName = file.getName().toLowerCase();
        for (String extension : imageExtensions) {
            if (fileName.endsWith(extension)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 调整图片大小并保存为指定格式。
     *
     * @param originalFile 原始图片文件
     * @param targetWidth  目标宽度
     * @param targetHeight 目标高度
     * @param format       保存的格式
     */
    private static void resizeImage(File originalFile, int targetWidth, int targetHeight, String format) {
        try {
            BufferedImage originalImage = ImageIO.read(originalFile);

            // 创建一个目标尺寸的图像
            BufferedImage resizedImage = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB);

            // 获取绘图上下文
            Graphics2D g2d = resizedImage.createGraphics();

            // 将原始图像拉伸到目标尺寸
            System.out.println("正在将原始图像拉伸到目标尺寸: " + originalFile.getName());
            System.out.println("图像原尺寸: "+originalImage.getWidth()+"x"+originalImage.getHeight());
            System.out.println("目标尺寸: "+targetWidth+"x"+targetHeight);
            g2d.drawImage(originalImage, 0, 0, targetWidth, targetHeight, null);

            // 释放绘图上下文
            g2d.dispose();

            // 保存为指定格式
            String newFileName = originalFile.getParent() + "/" + getFileNameWithoutExtension(originalFile) + "." + format;
            ImageIO.write(resizedImage, format, new File(newFileName));

            // 删除原始文件，除非是tif文件
            if (!originalFile.getName().toLowerCase().endsWith("." + format)) {
//            if (!originalFile.getName().toLowerCase().endsWith("." + "tif")) {
                if (!originalFile.delete()) {
                    System.err.println("无法删除文件: " + originalFile.getName());
                }
            }

            System.out.println("已处理文件: " + originalFile.getName());
        } catch (IOException e) {
            System.err.println("处理文件时出错: " + originalFile.getName() + " - " + e.getMessage());
        }
    }

    // 新增的adjustLabelPixels方法：处理标签图像的像素
    private static void adjustLabelPixels(File labelFile, int pixelValue) {
        try {
            BufferedImage labelImage = ImageIO.read(labelFile);

            for (int x = 0; x < labelImage.getWidth(); x++) {
                for (int y = 0; y < labelImage.getHeight(); y++) {
                    int pixel = labelImage.getRGB(x, y);

                    // 获取像素的RGBA值
                    int alpha = (pixel >> 24) & 0xFF;
                    int red = (pixel >> 16) & 0xFF;
                    int green = (pixel >> 8) & 0xFF;
                    int blue = pixel & 0xFF;

                    // 如果像素不是黑色，则设置为白色（你可以根据实际需求修改此规则）
                    if (red > 0 || green > 0 || blue > 0) {
                        pixel = (alpha << 24) | (pixelValue << 16) | (pixelValue << 8) | pixelValue; // 非黑色改为白色
                    } else {
                        pixel = (alpha << 24) | (0 << 16) | (0 << 8) | 0; // 黑色保持黑色
                    }

                    labelImage.setRGB(x, y, pixel);
                }
            }

            // 保存修改后的标签图像
            ImageIO.write(labelImage, "png", labelFile);
            System.out.println("已修改标签图像像素: " + labelFile.getName());
        } catch (IOException e) {
            System.err.println("无法处理标签图像: " + labelFile.getName());
        }
    }

    /**
     * 获取不带扩展名的文件名。
     *
     * @param file 文件
     * @return 不带扩展名的文件名
     */
    private static String getFileNameWithoutExtension(File file) {
        String fileName = file.getName();
        int dotIndex = fileName.lastIndexOf('.');
        return (dotIndex == -1) ? fileName : fileName.substring(0, dotIndex);
    }

    public static void main(String[] args) {
        // 示例：处理路径为 "/path/to/images" 的目录，调整图片大小为 256x256
        resizeAndConvertImages("/home/jolly/develop/project/java/TrainingManager/src/main/resources/datasets/1/袁伟/", 1024, 1024);
    }

    /**
     * 获取图片的宽度和高度。
     *
     * @param imageFile 图片文件
     * @return 包含图片宽度和高度的数组
     */
    public static int[] getImageWidthAndHeight(File imageFile) {
        int width = 0;
        int height = 0;
        try {
            BufferedImage image = ImageIO.read(imageFile);
            width = image.getWidth();
            height = image.getHeight();
//            System.out.println("Width: " + width + ", Height: " + height);
        } catch (IOException e) {
            System.err.println("无法读取图片文件: " + imageFile.getName());
        }
        return new int[]{width, height};
    }
}
